package server.controlleurs.tour;

import java.io.Serializable;
import java.rmi.AlreadyBoundException;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.util.ArrayList;

import rmi.UtilitairesRmi;
import server.models.equipe.IEquipe;
import server.models.posteDeTir.IPosteDeTir;
import server.models.terrain.ITerrain;
import server.models.tireur.ITireur;
import server.models.tour.ITour;
import server.models.tour.Tour;
import server.models.tour.Tour.ModeDeTir;

public class TourControlleur implements ITourControlleur, Serializable {

	private static final long serialVersionUID = 1L;

	private ITerrain terrainGerer;	
	private ITour tourActuel;
	private ArrayList<IEquipe> listeEquipes;



	public TourControlleur(ITerrain terrain, ArrayList<IEquipe> listeEquipes) {
		this.terrainGerer = terrain;
		this.listeEquipes = listeEquipes;
	}

	public void jouerTour()  throws RemoteException, AlreadyBoundException, NotBoundException {

		for (int i = 0; i < 8; i++) {
			this.initialiserNouveauTour();

			for (IEquipe equipe : this.listeEquipes) {
				for (ITireur tireur : equipe.getTireurs()) {
					this.tourActuel.changeCurrentTireur(tireur);
					this.tireurJoue(tireur);
				}
			}
		}

	}

	public void tireurJoue(ITireur tireur) throws RemoteException {
		IPosteDeTir posteDeTirSelectionne = tireur.getParticipant().getClient().getPosteDeTir(tireur.getListePostesDeTirAVisiter());
		tireur.removePosteDeTirAVisiter(posteDeTirSelectionne);

		if (posteDeTirSelectionne != null) {
			posteDeTirSelectionne.ajouterTireur(tireur);
		}

		this.assignerPlateauxCabanes();

		boolean plateauToucher = tireur.getParticipant().getClient().plateauLancerEtToucher();
		if (plateauToucher) {
			for (IEquipe equipe : this.listeEquipes) {
				if (equipe.getTireurs().contains(tireur)) {
					equipe.addToScore(1);
				}
			}
		}
	}

	public void initialiserNouveauTour() throws RemoteException, AlreadyBoundException, NotBoundException {
		this.resetPostesDeTir();

		int plusPetit = 1;
		int plusGrand = 3;
		int random = (int)(Math.random() * (plusGrand-plusPetit)) + plusPetit;
		this.tourActuel = (ITour)UtilitairesRmi.getInstance().obtenirEtBind(new Tour(Tour.ModeDeTir.values()[random - 1]));
	}

	/**
	 * Initialise tous les postes de tir.
	 * @throws RemoteException 
	 */
	private void resetPostesDeTir() throws RemoteException {
		for (IPosteDeTir poste : this.terrainGerer.getListePostesDeTir()) {
			poste.clearJoeur();
		}
	}

	/**
	 * Assigne un ou des plateau(x) au(x) cabane(s)
	 * @throws RemoteException 
	 */
	private void assignerPlateauxCabanes() throws RemoteException {
		if (this.tourActuel.getModeDeTir() == ModeDeTir.SIMPLE) {
			this.terrainGerer.getCabaneGauche().lancerPlateau();
		} else {
			this.terrainGerer.getCabaneGauche().lancerPlateau();
			this.terrainGerer.getCabaneDroite().lancerPlateau();
		}		
	}


}
